package ad_exercise_2.model;

/**
 * 
 * Deze abstracte klasse geeft aan welke methodes en variablen een stationNetwerk minimaal moet hebben.
 * 
 * @author Karen Berntsen (s0815799)
 * @author Erik Stens (s0615374)
 */
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public abstract class StationNetwerk {
	protected int		numStations;
	protected final int	INF	= 1000000;
	
	public StationNetwerk() {
	}
	
	public StationNetwerk(String filename) {
		try {
			read(filename);
		} catch (Exception e) {
			System.err.println("Er ging iets fout bij het inlezen van het netwerkbestand!");
			e.printStackTrace();
		}
	}
	
	public void init(int numStations) {
		this.numStations = numStations;
	}
	
	/**
	 * Leest de file en zal de informatie afdrukken ter controle
	 * 
	 * @param fileName
	 * @throws java.lang.IOException
	 *             als er iets fout gaat met openen of lezen van de file
	 */
	public void read(String fileName) throws IOException {
		File file = new File(fileName);
		Scanner scanner = new Scanner(new FileReader(file));
		
		int stations = scanner.nextInt();
		System.out.println("Dit netwerk heeft " + stations + " stations");
		scanner.nextLine();
		
		init(stations);
		
		while (scanner.hasNextLine()) {
			int station1 = scanner.nextInt();
			int station2 = scanner.nextInt();
			int afstand = scanner.nextInt();
			System.out.println("Er is een verbinding tussen station " + station1 + " en " + station2 + " met lengte " + afstand);
			try {
				addVerbinding(station1 - 1, station2 - 1, afstand);
			} catch (RuntimeException e) {
				e.printStackTrace();
				System.err.println(e.getMessage());
			}
			scanner.nextLine();
		}
	}
	
	public int getNumStations() {
		return numStations;
	}
	
	protected boolean inBounds(int station) {
		return station >= 0 && station < numStations;
	}
	
	/**
	 * Adds a new connection between two stations to the network
	 * 
	 * @param station1
	 * @param station2
	 * @param afstand
	 */
	public abstract void addVerbinding(int station1, int station2, int afstand);
	
	/**
	 * Finds the shortest route from station1 to station2
	 * 
	 * @param station1
	 * @param station2
	 */
	public abstract void kortsteRoute(int station1, int station2);
}
